#include "ota_http_curl.h"
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"

/**
 * @brief 把客户端获得的http响应数据 装配给结构体容器中
 */
static size_t ota_http_curl_write_callback(char *data, size_t size, size_t nmemb, void *userp)
{
    //1 强制结构体 userp 强制转换成结构体类型
    response_body_t *response_body = (response_body_t *)userp;
    //2  把客户端获得的http响应数据 装配给结构体容器中
    size_t size_all = size * nmemb;
    response_body->response_str = malloc(size_all+1);
    memcpy(response_body->response_str, data, size_all);
    response_body->response_str[size_all] = '\0'; //补结束符 
    //3  返回数据大小
    return size_all ;

}

/**
 * @brief  访问http地址 ，获得文本数据
 * 1  创建 curl客户端
 * 2  传入参数  ：  url 地址  、 接收数据的回调函数 、接收数据的容器结构体
 * 3  执行访问 
 * 4  清理 客户端
 */
response_body_t *ota_http_curl_get(char *url)
{
    // * 1  创建 curl客户端
    CURL *curl = curl_easy_init();

    // * 2  传入参数  ：  url 地址  、 接收数据的回调函数 、接收数据的容器结构体
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_curl_write_callback); //设置回调函数
    response_body_t *response_body = malloc(sizeof(response_body_t));
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_body); //设置回调函数
    // * 3  执行访问 
    CURLcode res= curl_easy_perform(curl);
    //判断访问是否成功
    if (res != CURLE_OK)
    {    
        log_error("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        return NULL;
    }
    // * 4  清理 客户端
    curl_easy_cleanup(curl);
    return response_body;

}


/**
 * @brief  访问http地址 ，获得二进制文件
 */
int  ota_http_curl_download(char *url,char *file_name)
{
       // * 1  创建 curl客户端
       CURL *curl = curl_easy_init();

       // * 2  传入参数  ：  url 地址  、 接收数据的回调函数 、接收数据的容器结构体
       curl_easy_setopt(curl, CURLOPT_URL, url);
       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); //设置回调函数

       FILE *file = fopen(file_name, "wb");
       curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); // 传入 文件指针作为接收数据的容器
       // * 3  执行访问 
       CURLcode res= curl_easy_perform(curl);
       //判断访问是否成功
       if (res != CURLE_OK)
       {    
           log_error("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
           return -1;
       }
       // * 4  清理 客户端
       curl_easy_cleanup(curl);
       fclose(file); // 一定要关闭 
       return 0;
}